package editorsvg.editor.documento;

import editorsvg.editor.atributos.AtrString;
import editorsvg.editor.comandos.GestorComandos;
import editorsvg.editor.serializacion.ElementoXml;
import editorsvg.gui.generico.Actualizable;
import editorsvg.propiedades.DefinicionPropiedades;
import editorsvg.propiedades.GrupoPropiedades;
import editorsvg.propiedades.PropiedadTexto;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.List;

/**
 *
 * @author Jorge Berjano
 */
public abstract class ElementoSVG implements Cloneable, Actualizable, ElementoXml {
    
    private AtrString id = new AtrString();
    private AtrString clase = new AtrString();    
    
    private DefinicionPropiedades propiedades;
    private static GrupoPropiedades propiedadesIdentificacion;
   

    public ElementoSVG() {
    }
       
    public final DefinicionPropiedades getPropiedades() {
        if (propiedades == null) {
            propiedades = new DefinicionPropiedades();
            poblarPropiedades();
        }     
        asignarPropietariosPropiedades();
        return propiedades;
    }
        
    protected void poblarPropiedades() {
        agregarPropiedades(getPropiedadesIdentificacion());
    }    
    
    protected void asignarPropietariosPropiedades() {
        getPropiedadesIdentificacion().setPropietario(this);
    }
    
    public static GrupoPropiedades getPropiedadesIdentificacion() {
        if (propiedadesIdentificacion == null) {
            propiedadesIdentificacion = new GrupoPropiedades("Identificacion");
            propiedadesIdentificacion.agregarPropiedad(new PropiedadTexto("id", "id"));
            propiedadesIdentificacion.agregarPropiedad(new PropiedadTexto("clase", "class"));
        }        
        return propiedadesIdentificacion;
    }
     
    protected final void agregarPropiedades(GrupoPropiedades grupo) {
        propiedades.agregar(grupo);
    }
    
    public void setGestorComandos(GestorComandos gestorComandos) {
        getPropiedades().setGestorComandos(gestorComandos);
    }

    @Override
    public String toString() {
        return "<" + getNombreTag() +
                (id.getTexto() != null && id.getTexto().length() > 0 ? " id=\"" + id + "\"" : "") +
                ">";
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        ElementoSVG clon = (ElementoSVG) super.clone();
        clon.id = (AtrString) id.clone();
        clon.clase = (AtrString) clase.clone();
        clon.propiedades = null;
        return clon;
    }
    
    public void pintar(Graphics2D graphics, AjustesGraficos ajustes) {
    }

    

    public AtrString id() {
        return id;
    }
    
    public AtrString clase() {
        return clase;
    }    
    
    
    public String getId() {
        return id.getValor();
    }

    public void setId(String valor) {
        id.setValor(valor);
    }

    public String getClase() {
        return clase.getValor();
    }

    public void setClase(String valor) {
        clase.setValor(valor);
    }

    /**
     * Recorre el elemento permitiendo al visitante visitar este elemento y
     * todos los que contenga.
     * @param visitante El visitante.
     * @return False si se desea interrumpir la visita.
     */
    public boolean recorrer(Visitante visitante) {
        return visitante.visitar(this);
    }

    @Override
    public List getAtributosXml() {
        return getPropiedades().getAtributosXml();
    }
    
    @Override
    public List<ElementoSVG> getHijos() {
        return null;
    }
    
    public Rectangle2D getEncuadre() {
        return null;
    }
    
    public Shape getContorno() {
        return null;
    }
    
    boolean contiene(Point2D posicion, double tolerancia) {
        return false;
    }
    
    /**
     * Agrega un fragmento de texto al elemento. Por defecto no hace nada.
     */
    public void agregarTexto(String texto) {        
    }
}
